let finir_partie ?(verbeux=false)
		 repartition
		 preneur
		 appele
		 demandee
		 pli_en_cours =
  let repartition = Array.copy repartition in
  (* On réattribue *)
  let () =
    Array.iteri
      (fun joueur jouee ->
       match jouee with
       | Some carte_jouee
	    when not
		   (List.exists
		      ((=) carte_jouee)
		      repartition.(joueur))->
	  (* La carte jouée n'est pas dans la répartition *)
	  repartition.(joueur) <- carte_jouee :: repartition.(joueur)
       | _ -> ())
      pli_en_cours
  in
  (* let () = Printf.printf "Répartition des cartes : \n%!" in *)
  (* let () = *)
  (*   Array.iteri *)
  (*     (fun i main -> *)
  (*      print_int i ; *)
  (*      print_string " : " ; *)
  (*      List.iter *)
  (* 	 (fun carte -> *)
  (* 	  print_string (Carte.string_of_carte carte) ; *)
  (* 	  print_string " ") *)
  (* 	 main ; *)
  (*      print_newline ()) *)
  (*     repartition *)
  (* in *)
  let scores = Array.make 5 0 in
  let bouts = Array.make 5 0 in
  let dernier_tour () =
    match repartition.(0) with
    | [_] -> true
    | _ -> false
  in
  let rec etape demandee pli_en_cours =
    if dernier_tour () then
      let () =
	if verbeux then
	  Printf.printf "C'est le dernier tour !\n%!"
      in
      let (score, bout) =
	Jouer_tour.jouer_tour
	  ~verbeux:verbeux
	  repartition preneur appele demandee pli_en_cours true in
      let () = Array.iteri (fun i score -> scores.(i) <- scores.(i) + score)
			   score in
      let () = Array.iteri (fun i bout -> bouts.(i) <- bouts.(i) + bout)
			   bout in
      (scores, bouts)
    else
      let (score, bout) =
	Jouer_tour.jouer_tour
	  ~verbeux:verbeux
	  repartition preneur appele demandee pli_en_cours false in
      let () = Array.iteri (fun i score -> scores.(i) <- scores.(i) + score)
			   score in
      let () = Array.iteri (fun i bout -> bouts.(i) <- bouts.(i) + bout)
			   bout in
      etape None (Array.make 5 None)
  in
  etape demandee pli_en_cours
